Guice এ @Inject এবং @Provider দুটি গুরুত্বপূর্ণ অ্যানোটেশন এবং কনসেপ্ট, যা Dependency Injection (DI) এবং Lazy Loading-এর জন্য ব্যবহৃত হয়। এখানে আমরা তাদের ব্যবহারের বিস্তারিত দেখব এবং বুঝে নেব কিভাবে Guice এ ইনজেকশন পরিচালনা করা যায়।
1. @Inject অ্যানোটেশন
@Inject হল Guice এর প্রধান অ্যানোটেশন, যা ব্যবহার করে Guice যেকোনো ক্লাসে নির্ভরশীলতাগুলি ইনজেক্ট করতে পারে। এটি বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে:
- Constructor Injection
- Field Injection
- Method Injection
Constructor Injection এর মাধ্যমে @Inject এর ব্যবহার
import com.google.inject.Inject;
public class Client {
private final Service service;
// Constructor Injection: @Inject অ্যানোটেশন দিয়ে ডিপেনডেন্সি ইনজেক্ট করা হচ্ছে
@Inject
public Client(Service service) {
this.service = service;
}
public void doSomething() {
service.serve();
}
}
এখানে, @Inject অ্যানোটেশনটি Client ক্লাসের কনস্ট্রাক্টরে Service ডিপেনডেন্সি ইনজেক্ট করার জন্য ব্যবহৃত হয়েছে।
Field Injection এর মাধ্যমে @Inject এর ব্যবহার
import com.google.inject.Inject;
public class Client {
@Inject
private Service service; // Field Injection: @Inject ব্যবহার করা হয়েছে
public void doSomething() {
service.serve();
}
}
এখানে, @Inject ব্যবহার করা হয়েছে ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করতে।
Method Injection এর মাধ্যমে @Inject এর ব্যবহার
import com.google.inject.Inject;
public class Client {
private Service service;
// Method Injection: @Inject ব্যবহার করে ডিপেনডেন্সি ইনজেক্ট করা
@Inject
public void setService(Service service) {
this.service = service;
}
public void doSomething() {
service.serve();
}
}
এখানে, @Inject ব্যবহার করা হয়েছে মেথডে, যা ডিপেনডেন্সি ইনজেক্ট করার জন্য Guice কে নির্দেশ দেয়।
2. @Provider এর ব্যবহার
@Provider হল Guice-এর একটি বৈশিষ্ট্য যা আপনাকে lazy loading (অথবা ডিপেনডেন্সি তৈরি হওয়ার বিলম্ব) করার জন্য সহায়ক। এটি মূলত Provider ক্লাসে ব্যবহৃত হয়, যা একটি নির্দিষ্ট সময়ে ডিপেনডেন্সি সরবরাহ করে।
Guice এর Provider ফিচার ব্যবহার করলে, আপনি নির্দিষ্ট করে বলতে পারেন যে, একটি ডিপেনডেন্সি কখন এবং কিভাবে তৈরি হবে। এটি ডিপেনডেন্সি ইনজেকশনের প্যাটার্নের মধ্যে Lazy Initialization তৈরি করে।
Provider Interface
Provider ইন্টারফেস একটি এক্সটেনশন হিসেবে কাজ করে যা ডিপেনডেন্সি তৈরি করার নিয়ম নির্ধারণ করে। উদাহরণস্বরূপ:
import com.google.inject.Provider;
public class ServiceProvider implements Provider<Service> {
@Override
public Service get() {
return new ServiceImpl(); // Service তৈরি করার জন্য ব্যবহৃত
}
}
এখানে, ServiceProvider ক্লাস Service ইন্টারফেসের একটি lazy instance তৈরি করবে। এই প্রোভাইডারটির মাধ্যমে যখনই Service এর প্রয়োজন হবে, তখনই তা তৈরি হবে।
@Provider অ্যানোটেশন ব্যবহার করা
Guice এ আপনি @Inject এর সাথে Provider ব্যবহার করে নির্দিষ্ট সময়ে ডিপেনডেন্সি ইনজেক্ট করতে পারেন।
import com.google.inject.Inject;
import com.google.inject.Provider;
public class Client {
private final Provider<Service> serviceProvider; // Provider এর মাধ্যমে Service ইনজেক্ট
@Inject
public Client(Provider<Service> serviceProvider) {
this.serviceProvider = serviceProvider;
}
public void doSomething() {
Service service = serviceProvider.get(); // Lazy loading
service.serve();
}
}
এখানে, Provider<Service> দ্বারা service লেজি লোডিংয়ের মাধ্যমে ইনজেক্ট করা হয়েছে। যখন serviceProvider.get() কল করা হয়, তখনই Guice Service তৈরি করবে।
Guice Module এ Provider ব্যবহার করা
import com.google.inject.AbstractModule;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).to(ServiceImpl.class);
bind(Service.class).toProvider(ServiceProvider.class); // Provider ব্যবহার করে bind করা
}
}
এখানে, Service ক্লাসের জন্য একটি ServiceProvider তৈরি করা হয়েছে, যা ডিপেনডেন্সি সরবরাহ করবে।
@Inject এবং @Provider এর মধ্যে পার্থক্য
| বিষয় | @Inject | @Provider |
|---|---|---|
| কার্য | ডিপেনডেন্সি ইনজেকশন করার জন্য ব্যবহৃত হয়। | ডিপেনডেন্সি তৈরি করার জন্য ব্যবহার করা হয় (Lazy Loading)। |
| ব্যবহার | সরাসরি ক্লাসের কনস্ট্রাক্টর, মেথড অথবা ফিল্ডে ইনজেক্ট করা হয়। | Provider এর মাধ্যমে ডিপেনডেন্সি তৈরি করা হয়। |
| এটি কিভাবে কাজ করে | Guice স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেক্ট করে। | Provider.get() কল করলে ডিপেনডেন্সি তৈরি হয়। |
| Lazy Initialization | সাধারণত নয় (যদিও এটি ইনজেকশন সময়ের মধ্যে হতে পারে)। | হ্যাঁ, ডিপেনডেন্সি লেজি লোডিং এর মাধ্যমে তৈরি হয়। |
@Injectঅ্যানোটেশন Guice-এ ডিপেনডেন্সি ইনজেকশনের প্রধান উপকরণ। এটি বিভিন্ন ধরনের ইনজেকশন (constructor, field, method) সমর্থন করে।@Providerব্যবহার করে আপনি ডিপেনডেন্সি লেজি লোডিং করতে পারেন। এটি বিশেষভাবে উপকারী যেখানে ডিপেনডেন্সিগুলি তৈরি করা বিলম্বিত করতে হবে বা খুব কম ব্যবহার হয়।
Guice ব্যবহার করে @Inject এবং @Provider এর মাধ্যমে কোডের নমনীয়তা এবং কার্যকারিতা বৃদ্ধি করতে পারবেন, এবং ডিপেনডেন্সি ম্যানেজমেন্ট আরও সহজ হবে।
Read more